//
//  Status.swift
//  sinaWeibo
//
//  Created by liii on 16/7/22.
//  Copyright © 2016年 liii. All rights reserved.
//

import UIKit
import AFNetworking
import SVProgressHUD
import SDWebImage

class Status: NSObject {

    // 属性
    var created_at: String?     // 微博创建时间
    var id: Int64 = 0           // 微博ID
    var text: String?           // 微博信息内容

    var user: User?             // 用户object
    
    // 创建时间, 计算型属性
    var created_time: String? {
        // 先把新浪服务器记录的时间, 转换成NSDate对象, 再跟当前时间比较, 进一步处理成字符串
        return NSDate.sinaDate(created_at!)?.fullDescription()
    }
    
    // 微博来源, 截取后赋值给sourceText
    var source: String? {
        didSet {
            // 新浪服务器返回的来源字符串: "<a href=\"http://app.weibo.com/t/feed/6vtZb0\" rel=\"nofollow\">微博 weibo.com</a>"
            let start = "\">"
            let end = "</a"
            if let s = source {
                if let startRange = s.rangeOfString(start), let endRange = s.rangeOfString(end) {
                    sourceText =  s.substringWithRange(startRange.endIndex ..< endRange.startIndex)
                }
                
            }
        }
    }
    var sourceText: String?
    
    // 原创微博配图数组
    var pic_urls: [[String : String]]? {
        didSet {
            guard let urls = pic_urls else {
                // 用户没有发布图片
                return
            }
            // 实例化一个数组
            imageURLs = [NSURL]()
            for item in urls {
                // 缩略图
                let urlString = item["thumbnail_pic"]
                // 高清大图
//                let largeURLString = urlString?.stringByReplacingOccurrencesOfString("thumbnail", withString: "large")
                let url = NSURL(string: urlString!)!
                imageURLs?.append(url)
            }
        }
    }
    // 配图URL
    var imageURLs: [NSURL]?
    
    var pictureURLs: [NSURL]? {
        // 如果是转发微博, 就返回转发微博的配图数组
        if retweeted_status != nil {
            return retweeted_status?.imageURLs
        }
        // 如果是原创微博, 就返回原创微博的配图数组
        return imageURLs
    }
    
    // 转发微博
    var retweeted_status: Status?
    
    // 字典转模型(相当于initWithDict:(NSDicionary *)dict)
    init(dict: [String: AnyObject]) {
        super.init()
        // 循环遍历所有键值, 同时调用setValue:forKey:给自定义对象的属性赋值
        setValuesForKeysWithDictionary(dict)
    }
    
    override func setValue(value: AnyObject?, forKey key: String) {
        
        // 对user做特殊处理
        if key == "user" {
            // 默认user为object类型, 需要转换为字典
            guard let dict = value as? [String : AnyObject] else {
                // 转换字典失败
                return
            }
            // 字典转模型
            user = User(dict: dict)
            // 防止user之下super的代码, 再次被转换为字典
            return
        }
        
        // 转发微博
        if key == "retweeted_status" {
            // 默认user为object类型, 需要转换为字典
            guard let dict = value as? [String : AnyObject] else {
                // 转换字典失败
                return
            }
            // 字典转模型
            retweeted_status = Status(dict: dict)
            // 防止user之下super的代码, 再次被转换为字典
            return
        }
        
        // 非"user"key, 即status的属性, 进行字典转模型
        super.setValue(value, forKey: key)
    }
    // 忽略不匹配key
    override func setValue(value: AnyObject?, forUndefinedKey key: String) {
        return
    }
    // 重写description方法
    override var description: String {
        let keys = ["id", "text", "source", "created_at"]
        let dict = self.dictionaryWithValuesForKeys(keys)
        return dict.description
    }
}

// 网络请求
extension Status {
    
    // 请求网络数据
    class func loadHomeData(since_id: Int64 = 0, max_id: Int64 = 0, finished: (dict: [Status]?) -> ()) {
        
        // 先从缓存取数据, 如果没有就下载, 如果有就直接使用缓存数据
        StatusDAL.loadHomeData(max_id, since_id: since_id) { (array) -> () in
            
            // 判断是否取到了数据, 如果没有返回空, 并推出
            guard let statuses = array else {
                finished(dict: nil)
                return
            }
            
            // 拿到数据
            // 实例化临时数组
            var tempArray = [Status]()
            // 遍历数组
            for item in statuses {
                // 字典转模型
                let s = Status(dict: item)
                // 添加到临时数组
                tempArray.append(s)
            }
            
            // 下载单张图片, 传递模型数组, 以及下载成功后的回调闭包
            cacheStatusSingleImage(tempArray, finished: finished)
        }
    }
    
    // 请求网络数据
    class func loadData(max_id: Int64 = 0, finished: (dict: [Status]?) -> ()) {
        // 用户过期判断
        guard let token = sharedUser.access_token else {
            print("用户未登陆, 或者token已过期")
            return
        }
        
        // 先从缓存取数据, 如果没有就下载, 如果有就直接使用缓存数据
        StatusDAL.loadHomeData(max_id) { (array) -> () in
            
            // 判断是否取到了数据, 如果没有返回空, 并推出
            guard let statuses = array else {
                finished(dict: nil)
                return
            }
            
            // 拿到数据
            // 实例化临时数组
            var tempArray = [Status]()
            // 遍历数组
            for item in statuses {
                // 字典转模型
                let s = Status(dict: item)
                // 添加到临时数组
                tempArray.append(s)
            }
            
            // 下载单张图片, 传递模型数组, 以及下载成功后的回调闭包
            cacheStatusSingleImage(tempArray, finished: finished)
        }
    }
    
    // 缓存单张图片
    class func cacheStatusSingleImage(statuses: [Status], finished: (dict: [Status]?) -> ()) {
        
        // 如果模型为空, 就回调一个空数组, 标示没有新数据
        if statuses.count == 0 {
            finished(dict: statuses)
            return
        }
        
        // GCD调度组: No.1 创建组
        let group = dispatch_group_create()
        
        // 遍历模型数组中, 所有模型的imageURLs属性, 判断图片的张数是否为一张
        for s in statuses {
            if let urls = s.pictureURLs where urls.count == 1 {
                // GCD调度组: No.2 在执行异步任务之前, 先执行入组操作, 群组任务池中的任务 + 1
                dispatch_group_enter(group)
                // 如果是单张图片, 就执行异步下载任务
                SDWebImageManager.sharedManager().downloadImageWithURL(urls.first, options: [], progress: nil, completed: { (_, _, _, _, _) -> Void in
                    print("单张图片下载成功")
                    
                    // GCD调度组: No.3 执行完异步任务后, 执行出组操作
                    dispatch_group_leave(group)
                })
            }
        }
        
        // 所有数据下载完毕后, 执行数据加载成功的回调
        dispatch_group_notify(group, dispatch_get_main_queue()) { () -> Void in
            // GCD调度组: No.4 执行完所有任务后, 发出一个通知
            print("所有图片都已经下载完毕")
            
            // 执行回调
            finished(dict: statuses)
        }
        
    }
}
